home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-20
/
caty16.zip
/
CATYDISP.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-02-02
|
19KB
|
474 lines
UNIT CATYDISP (* CATY Display routines D. J. Wilke N3HGQ 07/13/91 *);
INTERFACE
USES CRT, DOS, CATYGLO, CATYUTIL;
PROCEDURE PromptLine(Prompt : STRING);
PROCEDURE PrMessage(Mstring : String86; Tc : INTEGER);
PROCEDURE PrFrame (LeftCol,RightCol,TopRow,BottomRow : INTEGER);
PROCEDURE PrLines(Dir : STRING; X,X1,Y,Y1,Fg,Bg,Ch : INTEGER);
PROCEDURE PrRule;
PROCEDURE PrBox;
PROCEDURE PrFreq (Update : String86; ByteNo,Col,Row : INTEGER);
PROCEDURE PrMode (Param : String86; ByteNo,Col,Row : INTEGER);
PROCEDURE PrCTCSS(Param : String86; ByteNo,Col,Row : INTEGER);
PROCEDURE PrMem(Sb,Eb,SR,FC,MC,TC : INTEGER);
PROCEDURE PrStatusByte;
PROCEDURE PrBandLimits;
PROCEDURE PrDfPage(Pg,Rec,Nlines : INTEGER);
IMPLEMENTATION
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PromptLine(Prompt : STRING);
(* Display appropriate prompt on line 25 *)
BEGIN (* PromptLine *)
IF Prompt = 'F' THEN BEGIN (* Display Function keys on line 25 *);
FOR Index := 1 TO 80 DO
ScreenWrite(' ',Index,25,0); (* Clear it *)
ScreenWrite(' Function Keys ',35,24,PFG);
ScreenWrite('1 HB/GC',1,25,FKA);
ScreenWrite('2 Reset',10,25,FKA);
ScreenWrite('3 Band'+CHR(25),19,25,FKA);
ScreenWrite('4 Band'+CHR(24),27,25,FKA);
ScreenWrite('5 Splt'+CHR(18),35,25,FKA);
ScreenWrite('6 Clar'+CHR(29),43,25,FKA);
ScreenWrite('7 M'+CHR(26)+'VFO',51,25,FKA);
ScreenWrite('8 VFO'+CHR(26)+'M',59,25,FKA);
ScreenWrite('9 Swap*',67,25,FKA);
ScreenWrite('0 Exit',75,25,FKA);
END; (* IF Prompt = 'F' *)
IF Prompt = 'M' THEN BEGIN (* Disp menu msg on line 25 *);
FOR Index := 1 TO 80 DO
ScreenWrite(' ',Index,25,0); (* Clear it *)
FOR Index := 35 TO 49 DO
ScreenWrite(CHR(205),Index,24,SBA);
ScreenWrite('<Return> for Main Menu...',5,25,PFG);
Pause;
END; (* IF Prompt = 'M' *)
IF Prompt = 'S' THEN BEGIN (* Disp select msg on l 25 *);
FOR Index := 1 TO 80 DO
ScreenWrite(' ',Index,25,0); (* Clear it *)
FOR Index := 35 TO 49 DO
ScreenWrite(CHR(205),Index,24,SBA);
ScreenWrite('Make selection please...',5,25,PFG);
END; (* IF Prompt = 'S' *)
IF Prompt = 'T' THEN BEGIN (* Display Function keys on line 25 *);
FOR Index := 1 TO 80 DO
BEGIN
ScreenWrite(CHR(205),Index,23,SBA);
ScreenWrite(' ',Index,24,0); (* Clear line 24 *)
ScreenWrite(' ',Index,25,0); (* Clear line 25 *)
END;
ScreenWrite(CHR(200),1,23,SBA); (* Replace corners *)
ScreenWrite(CHR(188),80,23,SBA);
FOR Index := 35 TO 49 DO
ScreenWrite(CHR(205),Index,23,SBA);
ScreenWrite(' Function Keys ',35,23,PFG);
ScreenWrite('1 Help ',1,24,FKA);
ScreenWrite('2 Disp ',10,24,FKA);
ScreenWrite('3 Monit',19,24,FKA);
ScreenWrite('4 RTTY ',27,24,FKA);
ScreenWrite('5 Heard',35,24,FKA);
ScreenWrite('6 H Pak',43,24,FKA);
ScreenWrite('7 V Pak',51,24,FKA);
ScreenWrite('8 Disc ',59,24,FKA);
ScreenWrite('9 ARQ ',67,24,FKA);
ScreenWrite('0 Stat',75,24,FKA);
ScreenWrite('<Page Up> Converse <Page Down> CMD Mode '+
'<Home> Clear screen <End> Exits',1,25,PFG);
END; (* IF Prompt = 'T' *)
IF Prompt = 'V' THEN BEGIN (* Disp pager cmds on ln 24,25 *);
FOR Index := 1 TO 80 DO
BEGIN
ScreenWrite(CHR(205),Index,23,SBA);
ScreenWrite(' ',Index,24,0); (* Clear line 24 *)
ScreenWrite(' ',Index,25,0); (* Clear line 25 *)
END;
ScreenWrite(CHR(200),1,23,SBA); (* Replace corners *)
ScreenWrite(CHR(188),80,23,SBA);
FOR Index := 35 TO 49 DO
ScreenWrite(CHR(205),Index,23,SBA);
ScreenWrite(' Browsing Keys ',33,23,PFG);
ScreenWrite('<Page Up> <Page Down> <'+CHR(24)+','+CHR(25)+
'> to select <'+CHR(17)+CHR(196)+CHR(217)+
'> to set VFO<A> <End> to exit',1,25,PFG);
ScreenWrite('<'+CHR(27)+'> Datafile Reverse Scan <'+CHR(26)+
'> Datafile Forward Scan <Spacebar> stops scanning',1,24,PFG);
END; (* IF Prompt = 'V' *)
IF Prompt = 'W' THEN BEGIN (* Disp wait msg on line 25 *);
FOR Index := 1 TO 80 DO
ScreenWrite(' ',Index,25,0); (* Clear it *)
FOR Index := 35 TO 49 DO
ScreenWrite(CHR(205),Index,24,SBA);
ScreenWrite('Wait please...',5,25,PFG);
END; (* IF Prompt = 'W' *)
END; (* PromptLine *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrMessage(Mstring : String86; Tc : INTEGER);
(* Display message at line Tc centered horizontally *)
VAR
Lc : INTEGER;
BEGIN (* PrMessage *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
GOTOXY(40 - (LENGTH(Mstring) DIV 2) + 1,Tc);
WRITE(Mstring); (* Display Message centered *)
END; (* PrMessage *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrFrame (LeftCol,RightCol,TopRow,BottomRow : INTEGER);
(* Draw basic screen frame using graphics characters *)
VAR
Vert,HorizLength : INTEGER;
BEGIN (* PrFrame *)
(* Do the corners *)
ScreenWrite(CHR(201),LeftCol,TopRow,SBA);
ScreenWrite(CHR(187),RightCol,TopRow,SBA);
ScreenWrite(CHR(200),LeftCol,BottomRow,SBA);
ScreenWrite(CHR(188),RightCol,BottomRow,SBA);
(* Do the vertical lines *)
FOR Vert := TopRow + 1 TO BottomRow - 1 DO
BEGIN
ScreenWrite(CHR(186),LeftCol,Vert,SBA);
ScreenWrite(CHR(186),RightCol,Vert,SBA);
END;
(* Do the horizontal lines *)
HorizLength := RightCol - LeftCol - 1;
FOR Index := 1 TO HorizLength DO BEGIN
ScreenWrite(CHR(205),Index + 1,TopRow,SBA);
ScreenWrite(CHR(205),Index + 1,BottomRow,SBA);
END; (* FOR Index *)
END; (* PrFrame *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrLines(Dir : STRING; X,X1,Y,Y1,Fg,Bg,Ch : INTEGER);
(* Draw horiz or vert ruling lines *)
BEGIN (* PrLines *) (* Ch=graphics character *)
IF Dir = 'H' THEN BEGIN (* Draw horiz line *)
FOR Index := X TO X1 DO (* X=start col, X1=end col *)
ScreenWrite(CHR(Ch),Index,Y,Fg); (* Draw @row Y, in color Fg *)
END; (* IF Dir H *)
IF Dir = 'V' THEN BEGIN (* Draw vert line *)
FOR Index := Y TO Y1 DO (* Y=start row, Y1=end row *)
ScreenWrite(CHR(Ch),X,Index,Fg); (* Draw @col X, in color Fg *)
END; (* IF Dir V *)
END; (* PrLines *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrRule (* Display ruled lines at top of screen *);
BEGIN (* PrRule *)
ScreenWrite(CHR(204),1,5,SBA); (* Dbl tee, left *)
PrLines('H',2,79,5,0,SBA,DBG,205); (* Dbl H line, top *)
ScreenWrite(CHR(185),80,5,SBA); (* Dbl tee, right *)
END; (* PrRule *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrBox (* Display selected parameter box *);
(* Note: ABSOLUTE positions, not relative to window *)
BEGIN (* PrBox *)
ScreenWrite(CHR(201),57,7,SBA); (* Dbl corner, UL *)
PrLines('H',58,74,7,0,SBA,DBG,205); (* Top dbl line, box *)
ScreenWrite(CHR(187),75,7,SBA); (* Dbl corner, UR *)
ScreenWrite(CHR(186),57,8,SBA); (* Dbl V line, left *)
ScreenWrite(CHR(186),75,8,SBA); (* Dbl V line, right *)
ScreenWrite(CHR(200),57,9,SBA); (* Dbl corner, LL *)
PrLines('H',58,74,9,0,SBA,DBG,205); (* Bot dbl line, box *)
ScreenWrite(CHR(188),75,9,SBA); (* Dbl corner, LR *)
END;
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrFreq (Update : String86; ByteNo,Col,Row : INTEGER);
(* Decode and Display VFO, Operating & Memory frequencies *)
VAR
S : STRING[2];
Temp : STRING[8];
Freq : REAL;
Code : INTEGER;
BEGIN (* PrFreq *)
Temp := '';
TEXTCOLOR(SFG);
IF Col <> 8 THEN
TEXTBACKGROUND(DBG) (* Returned status colors *)
ELSE
TEXTBACKGROUND(BLUE); (* Special status colors *)
GOTOXY(Col,Row);
FOR Index := ByteNo TO ByteNo + 3 DO BEGIN (* Grab the 4 Freq bytes *)
STR(Bin2BCDHex(ORD(Update[Index])),S); (* Make string of BCD Hex *)
IF LENGTH(S) < 2 THEN
S := '0' + S; (* Must have leading zero *)
Temp := Temp + S; (* Build 8 byte Temp string *)
END; (* FOR Index *)
VAL(Temp,Freq,Code); (* Convert to REAL number *)
SelFreq := Freq; (* Store in Global Variable *)
WRITE((Freq/100000):9:5); (* Display 5 decimal places *)
IF Col > 8 THEN BEGIN
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
GOTOXY(Col+10,Row); WRITE('MHz.');
END (* IF Col *)
ELSE WRITE(' ');
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
END; (* PrFreq *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrMode (Param : String86; ByteNo,Col,Row : INTEGER);
(* Decode and Display modes *)
VAR
Mode : INTEGER;
ModeByte : CHAR;
BEGIN (* PrMode *)
IF Row = 4 THEN BEGIN
TEXTCOLOR(SFG); TEXTBACKGROUND(BLUE); (* Special status colors *)
END (* IF *)
ELSE BEGIN
TEXTCOLOR(SFG); TEXTBACKGROUND(DBG); (* Returned status colors *)
END; (* ELSE *)
ModeByte := Param[ByteNo]; (* nth byte of Update stream *)
Mode := Bin2BCDHex(ORD(ModeByte) AND 7); (* Mask off Mode bits *)
GOTOXY(Col,Row);
CASE Mode OF
0 : WRITE('LSB');
1 : WRITE('USB');
2 : WRITE('CW ');
3 : WRITE('AM ');
4 : WRITE('FM ');
5 : WRITE('FSK');
END; (* CASE *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
END; (* PrMode *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrCTCSS(Param : String86; ByteNo,Col,Row : INTEGER);
(* Decode and Display CTCSS tone frequencies *)
VAR
Tone : INTEGER;
CTCSS : REAL;
BEGIN (* PrCTCSS *)
Tone := 0; CTCSS := 0.0;
Tone := ORD(Param[ByteNo]); (* nth byte of Update stream *)
IF (Tone < $15) OR (Tone > $3E) THEN (* Valid value range *)
CTCSS := 0.0;
CASE Tone OF
$15 : CTCSS := 91.5;
$16 : CTCSS := 88.5;
$17 : CTCSS := 85.4;
$18 : CTCSS := 82.5;
$19 : CTCSS := 79.7;
$1A : CTCSS := 77.0;
$1B : CTCSS := 74.7;
$1C : CTCSS := 71.9;
$1D : CTCSS := 67.0;
$1E : CTCSS := 250.3;
$1F : CTCSS := 241.8;
$20 : CTCSS := 233.6;
$21 : CTCSS := 225.7;
$22 : CTCSS := 218.1;
$23 : CTCSS := 210.7;
$24 : CTCSS := 203.5;
$25 : CTCSS := 192.8;
$26 : CTCSS := 186.2;
$27 : CTCSS := 179.9;
$28 : CTCSS := 173.8;
$29 : CTCSS := 167.9;
$2A : CTCSS := 162.2;
$2B : CTCSS := 156.7;
$2C : CTCSS := 151.4;
$2D : CTCSS := 146.2;
$2E : CTCSS := 141.3;
$2F : CTCSS := 136.5;
$30 : CTCSS := 131.8;
$31 : CTCSS := 127.3;
$32 : CTCSS := 123.0;
$33 : CTCSS := 118.8;
$34 : CTCSS := 114.8;
$35 : CTCSS := 110.9;
$36 : CTCSS := 107.2;
$37 : CTCSS := 103.5;
$38 : CTCSS := 100.0;
$39 : CTCSS := 94.8; (* Hi-Q *)
$3A : CTCSS := 88.5; (* Hi-Q *)
$3B : CTCSS := 82.5; (* Hi-Q *)
$3C : CTCSS := 77.0; (* Hi-Q *)
$3D : CTCSS := 71.9; (* Hi-Q *)
$3E : CTCSS := 67.0; (* Hi-Q *)
END; (* CASE *)
TEXTCOLOR(SFG); TEXTBACKGROUND(DBG); (* Returned status colors *)
GOTOXY(Col,Row);
IF ToneEnc THEN BEGIN (* Is CTCSS bd installed? *)
WRITE(CTCSS:3:1);
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
GOTOXY(Col + 7,Row); WRITE ('Hz.');
END
ELSE BEGIN
TEXTCOLOR(SFG); TEXTBACKGROUND(DBG); (* Returned status colors *)
WRITE (' None '); (* No CTCSS board installed *)
END; (* ELSE *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
END; (* PrCTCSS *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrMem(Sb,Eb,SR,FC,MC,TC : INTEGER);
(* Decode & display memory Frequencies, Mode, Tone
Sb = Start byte in Update FC = Frequency column
Eb = Ending byte in Update MC = Mode column
SR = Starting screen row TC = CTCSS tone column *)
BEGIN (* PrMem *)
IF LENGTH(Update) = 86 THEN BEGIN (* Do only if full Update *)
WHILE Sb <= Eb DO BEGIN
PrFreq(Update,Sb,FC,SR); (* Print Freq *)
PrMode(Update,Sb + 5,MC,SR); (* Print Mode *)
PrCTCSS(Update,Sb + 4,TC,SR); (* Print Tone *)
SR := SR + 1; Sb := Sb + 6; (* Update pointers *)
END; (* WHILE *)
END; (* IF LENGTH *)
END; (* PrMem *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrStatusByte (* Decode and Display status byte *);
VAR
SBStr : STRING[8];
PTT,HamGen,TXInh,Split,VFO,MemR,Clar,CATS : INTEGER;
BEGIN (* PrStatusByte *)
PTT := Bin2BCDHex(ORD(Update[1]) AND $1); (* Mask off PTT bit *)
HamGen := Bin2BCDHex(ORD(Update[1]) AND $2); (* Mask off H/G bit *)
TXInh := Bin2BCDHex(ORD(Update[1]) AND $4); (* Mask off T/R bit *)
Split := Bin2BCDHex(ORD(Update[1]) AND $8); (* Mask off Split bit *)
VFO := Bin2BCDHex(ORD(Update[1]) AND $10); (* Mask off VFO bit *)
MemR := Bin2BCDHex(ORD(Update[1]) AND $20); (* Mask off MR bit *)
Clar := Bin2BCDHex(ORD(Update[1]) AND $40); (* Mask off Clar bit *)
CATS := Bin2BCDHex(ORD(Update[1]) AND $80); (* Mask off CatS bit *)
TEXTCOLOR(SFG); TEXTBACKGROUND(DBG); (* Returned status colors *)
GOTOXY(65,11);
IF PTT <> 0 THEN WRITE('Transmit') ELSE WRITE('Receive ');
GOTOXY(65,12);
IF HamGen <> 0 THEN WRITE('Gen Coverage') ELSE WRITE('Ham Bands');
GOTOXY(65,13);
IF TXInh <> 0 THEN WRITE('Inhibited') ELSE WRITE('Enabled ');
GOTOXY(65,14);
IF Split <> 0 THEN WRITE('Active ') ELSE WRITE('Inactive ');
GOTOXY(65,15);
IF VFO <> 0 THEN WRITE(' < B > ') ELSE WRITE(' < A > ');
GOTOXY(65,16);
IF MemR <> 0 THEN WRITE('Active ') ELSE WRITE('Inactive ');
GOTOXY(65,17);
IF Clar <> 0 THEN WRITE('Active ') ELSE WRITE('Inactive ');
GOTOXY(65,18);
IF CATS <> 0 THEN WRITE('Active ') ELSE WRITE('Inactive ');
END; (* PrStatusByte *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrBandLimits;
(* Display legal Advanced Class band limits *)
BEGIN (* PrBandLimits *)
(* Display band limits headings *)
GOTOXY(5,5); WRITE ('Advanced Class Band');
GOTOXY(27,5); WRITE ('CW Band Edge Limits');
GOTOXY(50,5); WRITE ('Phone Band Edge Limits');
PrLines('H',6,75,11,11,SBA,DBG,196); (* Display divider line *)
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(10,7); WRITE('160 Meters 1.800 - 1.850 MHz.');
GOTOXY(52,7); WRITE('1.850 - 2.000 MHz.');
GOTOXY(11,8); WRITE('80 Meters 3.525 - 3.750 MHz.');
GOTOXY(52,8); WRITE('3.775 - 4.000 MHz.');
GOTOXY(11,9); WRITE('40 Meters 7.025 - 7.150 MHz.');
GOTOXY(52,9); WRITE('7.150 - 7.300 MHz.');
GOTOXY(11,10); WRITE('30 Meters 10.100 - 10.150 MHz.');
GOTOXY(51,10); WRITE('CW/RTTY only-100 Watts.');
GOTOXY(11,11); WRITE('20 Meters 14.025 - 14.150 MHz.');
GOTOXY(51,11); WRITE('14.175 - 14.350 MHz.');
GOTOXY(11,12); WRITE('17 Meters 18.068 - 18.110 MHz.');
GOTOXY(51,12); WRITE('18.110 - 18.168 MHz.');
GOTOXY(11,13); WRITE('15 Meters 21.025 - 21.200 MHz.');
GOTOXY(51,13); WRITE('21.225 - 21.450 MHz.');
GOTOXY(11,14); WRITE('12 Meters 24.890 - 24.930 MHz.');
GOTOXY(51,14); WRITE('24.930 - 24.990 MHz.');
GOTOXY(11,15); WRITE('10 Meters 28.000 - 28.300 MHz.');
GOTOXY(51,15); WRITE('28.300 - 29.970 MHz.');
GOTOXY(11,16); WRITE(' 6 Meters 50.000 - 54.000 MHz.');
GOTOXY(50,16); WRITE('Use Repeater Directory.');
GOTOXY(11,17); WRITE(' 2 Meters 144.000 - 148.000 MHz.');
GOTOXY(50,17); WRITE('Use Repeater Directory.');
GOTOXY(11,18); WRITE('70 Cm. 420.000 - 450.000 MHz.');
GOTOXY(50,18); WRITE('Use Repeater Directory.');
END; (* PrBandLimits *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE PrDfPage(Pg,Rec,Nlines : INTEGER);
(* Display Nlines records at a time from datafile memory array *)
VAR
Item : INTEGER;
Mode : CHAR;
Freq,Offset,
Desc : STRING;
ModeStr : STRING[3];
LineOfData : STRING[70];
BEGIN (* PrDfPage *)
FOR Index := 1 TO Nlines DO BEGIN
Freq := '';
Offset := '';
Mode := ' ';
Desc := '';
LineOfData := '';
(* No Rec # means do a full page *)
IF Rec = 0 THEN BEGIN
Item := Pg * 10 + Index;
GOTOXY(2,Index);
END (* IF Rec *)
(* Rec # means do specific record *)
ELSE BEGIN
Item := Rec;
IF Item MOD(10) = 0 THEN
GOTOXY(2,Item MOD(10) +10)
ELSE GOTOXY(2,Item MOD(10));
END; (* ELSE *)
IF Item <= DataFileRec THEN BEGIN
Freq := COPY(MemArray[Item],15,7);
Offset := MemArray[Item,23];
Mode := MemArray[Item,13];
Desc := COPY(MemArray[Item],25,44);
CASE Mode OF
'L' : ModeStr := 'LSB';
'U' : ModeStr := 'USB';
'C' : ModeStr := 'CW ';
'A' : ModeStr := 'AM ';
'K' : ModeStr := 'FSK';
'F' : ModeStr := 'FM ';
END; (* CASE *)
LineOfData := ' ' +Freq +' ' +Offset +
' ' +ModeStr +' ' +Desc;
END; (* IF Item *)
WRITE(Item:3);
WRITE(LineOfData);
END; (* FOR Index *)
END; (* PrDfPage *)
END (* of UNIT CATYDISP *).